<?php
/**
 * 数据库类
 * 注意，如果用事物处理，不要用pconnect持续连接数据库。
 * 因为如果用持续连接的话，一个事物没有回滚，就会将所有的事物都堵死。
 *
 * @copyright Copyright (c) 2007 Itin studio (http://wanweiqun.blog.163.com)
 * @author kokko<kokko313@gmail.com>
 * @package com
 * @subpackage eefocus
 * @version 1.0 2007-11-29
 */
class Db{
	/**
     * 当前Database连接ID
     *
     * @var object resource
     * @access public
     */
	public $_connID;

	/**
	 * 数据库连接ID 支持多个连接
	 * 
	 * @var mix(object resource array or object resource)
	 * @access public
	 */
	public $_connIDs;
	
	/**
     * 查询结构集合
     *
     * @var resource object
     * @access public
     */
	public $_queryID;
	
	/**
     * 数据库查询次数
     *
     * @var resource object
     * @access public
     */
	public $_readTime = 0;
	
	/**
     * 数据库插入\更新\删除操作次数
     *
     * @var resource object
     * @access public
     */
	public $_writeTime = 0;
	
	/**
	 * Ddb Supported
	 * 是否支持分布式
	 *
	 * @Var Bool
	 * @Access Protected
	 */
	protected $_isEploy = false;
	
	/**
	 * is read write separated
	 * 是否读写分开
	 *
	 * @Var Bool
	 * @Access Protected
	 */
	protected $_isRWSeparate = false;
	
	/**
	 * result type
	 * 数据库结果类型
	 * 0 返回数组 1 返回对象
	 *
	 * @Var int
	 * @Access Protected
	 */
	protected $_resultType = 0;
	
	/**
	 * 事务指令数
	 *
	 * @Var int
	 * @Access Protected
	 */
	protected $_transTimes = 0;

	/**
	 * 是否自动提交查询
	 *
	 * @Var bool
	 * @Access Protected
	 */
    protected $_autoCommit  = true;

	/**
	 * sql语句
	 *
	 * @Var array
	 * @Access Protected 
	 */
	protected $_sqls;

	/**
     * 数据库表达式
     * 
     * @var string
     * @access protected
     */
    protected $_comparison = array('eq'=>'=','neq'=>'!=','gt'=>'>','egt'=>'>=','lt'=>'<','elt'=>'<=','like'=>'LIKE','between'=>'BETWEEN','notnull'=>'IS NOT NULL','null'=>'IS NULL');

	/**
	 * 取得对象实例
	 *
	 * @static
	 * @access public
	 */
	public static function getInstance(){
		static $db = null;
		if( $db==null ){
			include( conf( 'DB_SETTING' ) );
			$config = $DB_CONFIG;
			$db = new Db( $config );
		}
		return $db;
	}
	
	/**
	 * 构造函数
	 *
	 * @access public
	 */
	public function __construct( $config  ){
		//是否支持分布式
		if( conf( 'DB_ISEPLOY' ) ){
			$this->_isEploy = true;
		}
		//是否读写分离
		if( conf( 'DB_ISRWSEPARATE' ) ){
			$this->_isRWSeparate = true;
		}
		if( $this->_isEploy ){
			foreach( $config as $dbconfig ){
				$dbhost = $dbconfig['server'];
				$dbuser = $dbconfig['user'];
				$dbpw = $dbconfig['password'];
				$dbname = $dbconfig['database'];
				$dbcharset = $dbconfig['dbcharset'];
				$pconnect = $dbconfig['pconnect'];
				$this->addConnect( $dbhost,$dbuser,$dbpw,$dbname,$dbcharset,$pconnect );
			}
		}else{
			$dbhost = $config['server'];
			$dbuser = $config['user'];
			$dbpw = $config['password'];
			$dbname = $config['database'];
			$dbcharset = $config['dbcharset'];
			$pconnect = $config['pconnect'];
			$this->addConnect( $dbhost,$dbuser,$dbpw,$dbname,$dbcharset,$pconnect );	
		}
	}
	
	/**
	 * 添加数据库连接
	 *
	 * @access public
	 * @param string $dbhost 数据库服务器主机
	 * @param string $dbuser 数据库服务器帐号
	 * @param string $dbpw 数据库服务器密码
	 * @param string $dbname 数据库名
	 * @param string $dbcharset 数据库链接字符集
	 * @param bool $pconnect 是否保持持续连接，1为持续连接，0为非持续连接
	 * @return void
	 */
	public function addConnect($dbhost, $dbuser, $dbpw, $dbname,$dbcharset='utf8',$pconnect = 1){ 
		$func = $pconnect == 1 ? 'mysql_pconnect' : 'mysql_connect';
		if(!$this->_connID = @$func($dbhost, $dbuser, $dbpw))
		{
			$mes = 'Can not connect to MySQL server:'.$dbhost;
			throwException( $mes );
		}
		$this->_connIDs[] = $this->_connID;
		// 当mysql版本为4.1以上时，启用数据库字符集设置
		if($this->version() > '4.1' && $dbcharset )
        {
			mysql_query("SET NAMES '".$dbcharset."'" , $this->_connID);
		}
		// 当mysql版本为5.0以上时，设置sql mode
		if($this->version() > '5.0') 
		{
			mysql_query("SET sql_mode=''" , $this->_connID );
		}

		if($dbname) 
		{
			if(!@mysql_select_db($dbname , $this->_connID))
			{
				$mes = 'Cannot use database '.$dbname;
				throwException( $mes );
			}
		}
		
	}

	/**
	 * 转换链接
	 * 
	 * @access public
	 * @param mix $linkNum 数据库连接编号
	 * @return bool
	 */
	public function switchConnect( $linkNum ){
		// 存在指定的数据库连接序号
		if(isset($this->_connIDs[$linkNum])) {
			$this->_connID	=	$this->_connIDs[$linkNum];
			return true;
		}
		return false;
	}

	/**
	 * 设置当前使用的数据库链接ID
	 *
	 * @access public
	 * @param bool $master 是否主数据库连接
	 * @return bool
	 */
	public function setConnect($master=true){
		//如果不支持分布式，直接返回
		if( !$this->_isEploy )
			return true;
		// 主从式采用读写分离
		if( $this->_isRWSeparate ){
			if( $master )// 默认主服务器是连接第一个数据库配置
				$linkNum = 0;
			else	// 读操作连接从服务器
				$linkNum = floor(mt_rand(1,count($this->_connIDs)-1)); // 每次随机连接的数据库
		}else{// 读写操作不区分服务器
			$linkNum = floor(mt_rand(0,count($this->_connIDs)-1));// 每次随机连接的数据库
		}
		return $this->switchConnect( $linkNum );
	}
	
	/**
	 * 设置当前使用的数据库链接ID
	 *
	 * @access public
	 * @param string $tables 数据库表
	 * @param mix $where SQL查询where条件
	 * @param string $fields 获取表字段
	 * @param mix $order 排序
	 * @param string $limit 查询limit限定
	 * @param mix $join	- 查询join语句限定
	 * @param mix $group 查询group语言限定
	 * @return bool
	 */
	public function select($tables,$where=null,$fields='*',$limit=null,$order=null,$join=null,$group=null ){
		$this->setConnect(false);
		$sql = 'SELECT '.$this->parseFields( $fields ).' FROM '.$tables
			.$this->parseJoin($join)
			.$this->parseWhere($where)
			.$this->parseGroup($group)
			.$this->parseOrder($order)
			.$this->parseLimit($limit);
		if( !$this->query( $sql ) ){
			return false;
		}
		$this->_readTime++;
		return true;
	}
	
	/**
	 * 更新查询
	 * $this->update( 'user',array( 'id'=>array( 'exp', 'substr(1)' ) ),'uid=1' );
	 * UPDATE user SET `id` = substr(1) WHERE uid=1
	 * $this->update( 'user',array( 'id'=>1,'nam'=>'kokko' ),'uid=1' );
	 * UPDATE user SET `id` = 1,`nam` = 'kokko' WHERE uid=1
	 * 
	 * @access public
	 * @param string $table 数据库表
	 * @param array $fields 更新表字段数组对
	 * @param mix $where SQL查询where条件
	 * @param string $limit 查询limit限定
	 * @return void
	 */
	public function update( $table,$fields,$where=null,$limit=null,$order='' ){
		$this->setConnect(true);
		$sql =    'UPDATE '.$table.' SET '.$this->parseSets( $fields ).$this->parseWhere($where).$this->parseOrder($order).$this->parseLimit($limit);
		if( !$this->query( $sql ) ){
			return false;
		}
		$this->_writeTime++;
		return true;
	}
	
	/**
	 * 删除
	 * 
	 * @access public
	 * @param string $table 数据库表
	 * @param mix $where SQL查询where条件
	 * @param string $limit 查询limit限定
	 * @return void
	 */
	public function delete( $table,$where=null,$limit=null ){
		$this->setConnect(true);
		$sql =    'DELETE FROM '.$table.$this->parseWhere($where).$this->parseLimit($limit);
		if( !$this->query( $sql ) ){
			return false;
		}
		$this->_writeTime++;
		return true;
	}
	
	/**
	 * replace查询
	 * 
	 * @access public
	 * @param string $table 数据库表
	 * @param array $fields 更新表字段数组对
	 * @return void
	 */
	public function replace( $table,$fields ){
		$this->setConnect(true);
		$sql =    'REPLACE INTO '.$table.' SET '.$this->parseSets( $fields );
		if( !$this->query( $sql ) ){
			return false;
		}
		$this->_writeTime++;
		return true;
	}
	
	/**
      * 插入单个记录
	  *
      * @access public 
      * @param array $data 数据列表
      * @param string $table  数据表名
      * @return bool
      */
	function insert( $table,$data ){
		$this->setConnect(true);
		$fields = array_keys($data);
		array_walk($fields, array($this, 'addSpecialChar'));
		$fieldsStr = implode(',', $fields);
		$values = array_values($data);
		array_walk($values, array($this, 'fieldFormat'));
		$valuesStr = implode(',', $values);
		$sql = 'INSERT INTO '.$table. ' ('.$fieldsStr.') VALUES('.$valuesStr.')';
		if( !$this->query( $sql ) ){
			return false;
		}
		$this->_writeTime++;
		return true;
	}
	
	 /**
      * 插入多个记录
	  *
      * @access public 
      * @param array $data 数据列表
      * @param string $table  数据表名
      * @return bool
      */
	function insertAll( $table,$data ){
		$this->setConnect(true);
		$fields = array_keys((array)$data[0]);
		array_walk($fields, array($this, 'addSpecialChar'));
		$fieldsStr = implode(',', $fields);
		if( empty( $fieldsStr ) )
			return false;
		foreach( $data as $_data ){
			$_values = array_values($_data);
			array_walk($_values, array($this, 'fieldFormat'));
			$values[] = '( '.implode(',', $_values).')';
		}
		$valuesStr = implode(',',$values);
		$sql = 'INSERT INTO '.$table.' ('.$fieldsStr.') VALUES '.$valuesStr;
		if( !$this->query( $sql ) ){
			return false;
		}
		$this->_writeTime++;
		return true;
	}
	
	/**
     * 开始事务
	 *
     * @access public 
     * @return boolen
     */
	public function startTrans() {
		//数据rollback 支持
		if ($this->_transTimes == 0) {
			//@mysql_query('SET AUTOCOMMIT=0', $this->_connID);
			//@mysql_query('BEGIN', $this->_connID);
			mysql_query('START TRANSACTION', $this->_connID );
		}
		$this->_transTimes++;
		return ;
	}

	/**
     * 用于非自动提交状态下面的查询提交
	 *
     * @access public 
     * @return boolen
     */
    public function commit()
    {
        if ($this->_transTimes > 0) {
            $result = mysql_query('COMMIT', $this->_connID);
            $this->transTimes = 0;
            if(!$result){
               throwException( $this->error() );
                return false;
            }
        }
        return true;
    }

    /**
     * 事务回滚
	 *
     * @access public 
     * @return boolen
     * @throws ThinkExecption
     */
    public function rollback()
    {
        if ($this->_transTimes > 0) {
            $result = mysql_query('ROLLBACK', $this->_connID);
            $this->_transTimes = 0;
            if(!$result){
                throwException($this->error());
                return false;
            }
        }
        return true;
    }

	/**
	 * 执行sql语句，只得到一条记录
	 *
	 * @param string $sql sql语句
	 * @param int $seek 默认为0，结果偏移
	 * @param int $resultType
	 * @return array
	 */
	function getRow( $sql = null,$seek=0,$resultType=0 )
	{
		if (!empty($sql)) $this->query($sql);
		if(is_null($resultType)) $resultType   =  $this->_resultType;
		$result = null;
		if( $this->numRows() >0 ) {
			if( $seek>0 ){
				mysql_data_seek($this->_queryID,$seek);
			}
			$func = ($resultType==1) ? 'mysql_fetch_object' : 'mysql_fetch_assoc';
			if( $result = $func( $this->_queryID ) )
				return $result;
        }
        return $result;
	}

	/**
	 * 执行sql语句，只得到一条记录
	 *
	 * @param string $sql sql语句
	 * @param int $seek 默认为0，结果偏移
	 * @param int $resultType
	 * @return array
	 */
	function getAll( $sql = null,$resultType=0 )
	{
		if (!empty($sql)) $this->query($sql);
		if(is_null($resultType)) $resultType   =  $this->_resultType;
		$result = null;
		if( $this->numRows() >0 ) {
			$func = ($resultType==1) ? 'mysql_fetch_object' : 'mysql_fetch_assoc';
			while( $row = $func( $this->_queryID ) ){
				$result[] = $row;
			}
        }
        return $result;
	}

	/**
	 * 取得结果集中行的数目
	 * @return int
	 */
	function numRows() 
	{
		if( $this->_queryID )
			return mysql_num_rows( $this->_queryID );
		return 0;
	}

	/**
	 * 根据查询取得一行,以数字为数组的索引
	 *
	 * @return array
	 */
	function fetchRow() 
	{
		return mysql_fetch_row( $this->_queryID );
	}

	/**
	 * 取得前一次 MySQL 操作所影响的记录行数
	 *
	 * @return int
	 */
	function affectedRows() 
	{
		return mysql_affected_rows($this->_connID);
	}

	/**
	 * 取得上一步 INSERT 操作产生的 ID 
	 *
	 * @return int
	 */
	function insertId() 
	{
		return mysql_insert_id($this->_connID);
	}
	
	/**
	 * 释放当前查询连接
	 *
	 * @return void
	 */
	function freeResult() 
	{
		return mysql_free_result($this->_queryID);
	}
	
	/**
	 * 取得当前数据库的版本信息
	 *
	 * @return string
	 */
	function version(){
		return mysql_get_server_info($this->_connID);
	}

	/**
	 * 返回当前错误信息
	 * 
	 * @return string
	 */
	function error()
	{
		return @mysql_error( $this->_connID );
	}

	/**
	 * 关闭当前数据库联接
	 *
	 * @return unknown
	 */
	function close() 
	{
		if (!empty($this->_queryID))
            mysql_free_result($this->_queryID);
        if (!mysql_close($this->_connID)){
            throwException( $this->error() );
        }
        $this->_connID = false;
	}

	/**
	 * 获取当前数据库类型
	 *
	 * @return string
	 */
	function getDbType(){
		return 'MYSQL';
	}
	
	/**
	 * 析构函数
	 *
	 * @return void
	 */
	function destruct(){
		$this->close();
	}

	/**
	 * 执行sql语句
	 *
	 * @param string sql语句
	 * @return resource
	 */
	public function query($sql) 
	{
		if( !$this->_connID ) return false;
		if (!$this->_autoCommit && $this->isMainIps($sql)) {
			$this->startTrans();
        }else {
            //释放前次的查询结果
           if ( is_resource( $this->_queryID ) )
				$this->freeResult();
				
        }
		//记录执行开始时间
		$start = microtime(TRUE);
		if(! ($query = mysql_query($sql , $this->_connID)) )
		{
			$mes = "Mysql Query Error:".$sql;
			throwException( $mes."\n".$this->error() );
		}else{
			//记录执行结束时间
			$end = microtime(TRUE);
			$be = $end-$start;
			$mes = "Mysql Query Succeed:".$sql."\nQuery time:".$be;
			logMessage( $mes,6 );
			$this->_queryID = $query;
			return true;
		}
		return false;
	}

	/**
     * 是否为数据库更改操作
	 *
     * @access protected 
     * @param string $query  SQL指令
     * @return boolen 如果是查询操作返回false
     */
    protected function isMainIps($query)
    {
        $queryIps = 'INSERT|UPDATE|DELETE|REPLACE|'
                . 'CREATE|DROP|'
                . 'LOAD DATA|SELECT .* INTO|COPY|'
                . 'ALTER|GRANT|REVOKE|'
                . 'LOCK|UNLOCK';
        if (preg_match('/^\s*"?(' . $queryIps . ')\s+/i', $query)) {
            return true;
        }
        return false;
    }
	
	/**
	 * limit分析
	 *
	 * @param string $limit
	 * @return string
	 * @access protected
	 */
	protected function parseLimit( $limit ){
		if( empty($limit) )
			return null;
		$limitStr = ' LIMIT '.$limit.' ';
		return $limitStr;
	}

	/**
	 * 排序语句分析
	 *
	 * @param mix $order array or string
	 * @return string
	 * @access protected
	 */
	protected function parseOrder( $order ){
		$orderStr = '';
		 if(is_array($order))
		 	 $orderStr .= ' ORDER BY '.implode(',', $order);
		 else if(is_string($order) && !empty($order)) 
            $orderStr .= ' ORDER BY '.$order;
        return $orderStr;
	}

	/**
	 * group解析
	 *
	 * @param mix $group
	 * @return string
	 * @access protected
	 */
	protected function parseGroup($group){
		$groupStr = '';
        if(is_array($group))     
            $groupStr .= ' GROUP BY '.implode(',', $group);
        else if(is_string($group) && !empty($group)) 
            $groupStr .= ' GROUP BY '.$group;
        return $groupStr;
	}

	/**
	 * join解析
	 * left, right, outer, inner, left outer, and right outer.
	 * array( 'user'=>array( '_t'=>'left','t'=>'blog','f'=>'id','tf'=>'uid' ) )
	 * array( 'user ON user.id=blog.uid' )
	 * 
	 * @return string
	 * @access protected
	 */
	protected function parseJoin( $join ){
		if( empty( $join ) )
			return null;
		$joinStr = '';
		if(is_array($join)) {
			$joins = array();
			$defType = 'LEFT';
			foreach ($join as $key=>$val)
			{
				if( is_string( $val ) ){
					$joins[] = $defType.' JOIN '.$val;
				}else{
					$joinType = isset( $val['_t'] )?strtoupper($val['_t']):$defType;
					$joins[] = "{$joinType} JOIN `{$key}` ON `{$key}`.`{$val['f']}`=`{$val['t']}`.`{$val['tf']}`";
				}
			}
			$joinStr .= implode( ',',$joins );
		}else{
			$joinStr .= ' LEFT JOIN ' .$join;
		}
        return $joinStr;
	}

	/**
	 * where条件句分析
	 * <pre>
	 $array = array(
	 		'id'=> array( 'in',array('1','2','3','4') ),
	 		'cid'=>1,
			'tid'=> array( 1, 10 ),
	 		'name'=> array( 'like','%ko%' ),
	 		'_logic' => 'AND',
	 		'id,title,name,bid,uid' => array( 
	 			array('notnull'),
	 			array( 'like','aaaa' ),
	 			'kokko',
	 			10,
	 			array( 1,10,'gt','lt','AND'),	//区间比较
	 			'OR'
	 		)
	 	);
	 *	$this->parseWhere( $array );
	 *  WHERE (`id` IN('1','2','3','4') ) AND (`cid`=1) AND (`tid`>=1 AND  `tid`<=10) AND (`name` LIKE '%ko%') AND ((`id` IS NOT NULL) OR (`title` LIKE 'aaaa') OR (`name`='kokko') OR (`bid`=10) OR (`uid`>1 AND `uid`<10))
	 * </pre>
	 *
	 * @param mix $where
	 * @return string
	 * @access protected
	 */
	public function parseWhere($where){
		if( empty( $where ) )
			return null;
		$whereStr = '';
		if(is_string($where) || is_null($where)) { 
			$whereStr = $where; 
		}else{
			$conditionArray = array();
			if(array_key_exists('_logic',$where)) { // 定义逻辑运算规则 例如 OR XOR AND NOT
				$operate	=	' '.strtoupper($where['_logic']).' ';
				unset($where['_logic']);
			}else{// 默认进行 AND 运算
				$operate	=	' AND ';
			}
			foreach ($where as $key=>$val){
				if(strpos($key,',')) {
					$key	=	explode(',',$key);
					if('MYSQL' == $this->getDbType() ) {
						array_walk($key, array($this, 'addSpecialChar'));
					}
				}elseif('MYSQL' == $this->getDbType()) {
					$key = $this->addSpecialChar($key);
				}
				// 多字段组合查询
				if( is_array( $key ) ){
					$str = array();
					$num	=	count($key);
					if(empty($val[$num])) $val[$num]	=	'AND'; //
					for( $i=0;$i<$num;$i++){
						$str[] = "(".$this->doParseWhere( $key[$i],$val[$i] ).")";
					}
					$conditionArray[] = '('.implode( " ".strtoupper($val[$num])." ",$str ).')';
				}else{
					$conditionArray[] = '('.$this->doParseWhere( $key,$val ).')';
				}
			}
			if( !empty( $conditionArray ) )
				$whereStr = implode( $operate,$conditionArray );
		}
		return empty($whereStr)?'':' WHERE '.$whereStr;
	}

	/**
     * value分析
     * 
     * @access protected 
     * @param mixed $values
     * @return string
     */
    protected function parseValues($values)
    {
        if(is_array($values)) {
            array_walk($values, array($this, 'fieldFormat'));
            $valuesStr = implode(',', $values);
        }
        else if(is_string($values)) 
            $valuesStr = $values;
        return $valuesStr;
    }

	/**
	 * 解析update数组
	 *
	 * @param mix $sets 待解析数组
	 * @return string
	 */
	protected function parseSets($sets){
		$setsStr = '';
		if( is_string($sets) ){
			$setsStr = $sets;
		}else{
			foreach ($sets as $key=>$val){
				$key	=	$this->addSpecialChar($key);
				if(is_array($val) && strtolower($val[0]) == 'exp') {
					$val	=	$val[1];						// 使用表达式
				}elseif(!is_null($val) && is_scalar($val)){
					$val	=	$this->fieldFormat($val);
				}else{
					// 过滤控制和复合对象
					continue;
				}
				$setsStr .= "$key = ".$val.",";
			}
			$setsStr = substr($setsStr,0,-1);
		}
		return $setsStr;
	}

	/**
     * fields分析
	 *
     * @access protected 
     * @param mixed $fields
     * @return string
     */
    protected function parseFields($fields)
    {
        if(is_array($fields)) {
            array_walk($fields, array($this, 'addSpecialChar'));
            $fieldsStr = implode(',', $fields);
        }else if(is_string($fields) && !empty($fields)) {
            if( false === strpos($fields,'`') ) {
                $fields = explode(',',$fields);
                array_walk($fields, array($this, 'addSpecialChar'));
                $fieldsStr = implode(',', $fields);
            }else {
            	$fieldsStr = $fields;
            }
        }else 
            $fieldsStr = '*';
        return $fieldsStr;
    }

	/**
	 * 字段和表名添加` 
	 * 保证指令中使用关键字不出错 针对mysql
	 *
	 * @param mix $value
	 * @return mix
	 * @access protected
	 */
	protected function addSpecialChar( &$value ){
		if( '*' == $value ||  false !== strpos($value,'(') || false !== strpos($value,'.') || false !== strpos($value,'`')) {
            //如果包含* 或者 使用了sql方法 则不作处理
        } elseif(false === strpos($value,'`') ) {
            $value = '`'.trim($value).'`';
        }
        return $value;
	}

	/**
     * 字段格式化
     * 
     * @access protected 
     * @param mixed $value 格式化值
     * @return mixed
     */
    protected function fieldFormat(&$value) 
    {
        if(is_int($value)) {
            $value = intval($value);
        } else if(is_float($value)) {
            $value = floatval($value);
        } elseif(preg_match('/^\(\w*(\+|\-|\*|\/)?\w*\)$/i',$value)){
			// 支持在字段的值里面直接使用其它字段
			// 例如 (score+1) (name) 必须包含括号
			$value = $value;
		}else if(is_string($value)) {
            $value = '\''.mysql_escape_string($value).'\'';
        }
        return $value;
    }

	/**
	 * 根据字段以及字段设置进行条件解析
	 * 
	 * @access private
	 * @param string $field
	 * @param mix $condition
	 * @return string
	 */
	private function doParseWhere( $field,$condition ){
		$str = null;
		if( !is_array( $condition ) )
			$str = $field. "=". $this->fieldFormat( $condition );
		else{
			// 区间比较 第一个参数是整数
			if( is_int( $condition[0] ) ){
				$one = $condition[0];
				$two = $condition[1];
				$opt1 = isset( $condition[2] ) ? $condition[2] : 'egt';
				$opt2 = isset( $condition[3] ) ? $condition[3] : 'elt';
				$com = isset( $condition[4] ) ? strtoupper( $condition[4] ) : 'AND';
				//逻辑错误
				if( !in_array( $com,array( 'AND','OR','XOR' )) ){
					return null;
				}
				//if( strtolower($opt1) )
				$opt1 = $this->_comparison[strtolower($opt1)];
				$opt2 = $this->_comparison[strtolower($opt2)];
				$str = $field. "$opt1". $this->fieldFormat( $one );
				$str .= " $com ";
				$str .= $field."$opt2". $this->fieldFormat( $two );
			}else{
				//这里我们不解析between了，因为可以用区间比较代替它
				$condition[0] = strtolower($condition[0]);
				if( $condition[0] =='in' || $condition[0] =='not in' || $condition[0] =='notin' ){
					$com = $condition[0]=='in' ? 'IN' : 'NOT IN';
					if( is_array( $condition[1] ) ){
						array_walk( $condition[1],array($this, 'fieldFormat'));
						$condition[1] = implode( ',',$condition[1] );
					}
					$str = $field." $com($condition[1]) ";
				}elseif( $condition[0] == 'notnull' || $condition[0] == 'null' ){
					$str = $field.' '.$this->_comparison[$condition[0]];
				}else{
					$str = $field.' '.$this->_comparison[strtolower($condition[0])].' '.$this->fieldFormat( $condition[1] );
				}
			}
		}
		return $str;
	}
}
?>